# !/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
===========================
@Time : 2022/8/16 0016 20:42
@Author : 测试开发工程师
@File : 2. 数组与列表.py
@Software: PyCharm
============================
"""

"""
什么是数组   temp0  temp1  temp2  temp3
数组是 线性表 数据结构，用 连续的内存空间存储 相同类型的数据
    线性表：线性表是数据排成一条线一样的结构，每个线性表上的数据最多只有前和后两个方向。包括：数组，链表，堆列，栈
    非线性表： 数据之前并不是简单的前后关系。包括： 二叉树，堆，图等
    连续的内存空间和相同类型的数据：使数组支持 "随机访问"。但在数组中删除，插入数据时，需要大量的数据搬移工作
    
"""


class Array:

    def __init__(self, capacity) -> None:
        self.data = [] * capacity
        # 记录存了多少数据
        self.count = 0
        # 数组容量
        self.n = capacity

    # 插入值
    def insert(self, location, value):
        # 边界值
        if self.n == self.count:
            return False
        # 边界值
        if location < 0 or location > self.count:
            return False
        # 向后移动一个位置
        for i in range(self.count, location, -1):
            self.data[i] = self.data[i - 1]

        self.data[location] = value
        self.count += 1
        return True

    # 查找值
    def find(self, location):
        # 边界判断
        if location < 0 or location >= self.count:
            return -1
        return self.data[location]

    # 删除值
    def delete(self, location):
        if location < 0 or location >= self.count:
            return False
        # 向前移动一个位置
        for i in range(location + 1, self.count):
            self.data[i - 1] = self.data[i]
        self.count -= 1
        return True


def test_demo():
    array = Array(5)
    array.insert(0, 1)
    array.insert(0, 2)
    array.insert(1, 3)
    array.insert(2, 4)
    array.insert(4, 5)

    # 判断插入不成功： 增加， 查找 ， 删除
    assert not array.insert(0, 100)
    assert array.find(0) == 2
    assert array.find(2) == 4
    assert array.find(4) == 5
    assert array.find(10) == -1
    # assert arr(variable)
    # array: Any
    assert array.count == 5
    removed = array.delete(4)
    assert removed
    assert array.find(4) == -1
    removed = array.delete(10)
    assert not removed
    assert array.data == [2, 3, 4, 1, 5]


if __name__ == '__main__':
    test_demo()
